package com.lld.im.codec;

import com.alibaba.fastjson.JSONObject;
import com.lld.im.codec.proto.Message;
import com.lld.im.codec.proto.MessageHeader;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;
import java.util.Stack;

/**
 * @author: LunBoWang
 * @description: 消息解码类
 * @date: 2025/3/26 下午7:41
 * @version: 1.0
 */

public class MessageDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {
        //请求头（指令
        //版本
        //clientType
        //消息解析类型
        //appId
        //imei长度
        //bodylen+imei号+请求体
        // 1. 检查最小可读字节数(28字节=7个int字段)
        if (in.readableBytes() < 28) {
            return; // 数据不足时等待后续数据
        }

        // 2. 按顺序读取固定长度的协议头字段
        //获取command
        int command = in.readInt();
        //获取版本号
        int version = in.readInt();
        //获取clientType
        int clientType = in.readInt();
        //获取消息解析类型
        int messageType = in.readInt();
        //获取appId
        int appId = in.readInt();
        //获取imei长度
        int imeiLen = in.readInt();
        //获取bodyLen
        int bodyLen = in.readInt();
        // 3. 检查可变长度数据是否完整
        if (in.readableBytes() < bodyLen + imeiLen) {
            in.resetReaderIndex(); // 回滚读取位置
            return;
        }
        // 读取IMEI(设备标识)
        byte[] imeiData = new byte[imeiLen];
        in.readBytes(imeiData);
        String imei = new String(imeiData);
        // 读取消息体
        byte[] bodyData = new byte[bodyLen];
        in.readBytes(bodyData);
        String body = new String(bodyData);

        // 构建消息头
        MessageHeader messageHeader = new MessageHeader();
        messageHeader.setAppId(appId);
        messageHeader.setClientType(clientType);
        messageHeader.setCommand(command);
        messageHeader.setLength(bodyLen);
        messageHeader.setVersion(version);
        messageHeader.setMessageType(messageType);
        messageHeader.setImei(imei);
        // 构建完整消息
        Message message = new Message();
        message.setMessageHeader(messageHeader);
        // 处理JSON格式消息体
        if (messageType == 0x0) {
            //json
            String bo = new String(bodyData);
            JSONObject parse = (JSONObject) JSONObject.parse(bo);
            message.setMessagePack(parse);
        }

        //重置读指针
        in.markReaderIndex();
        out.add(message);
    }
}
